import matplotlib.pyplot as plt
import numpy as np

# =================== 曲线图 =========================
x = np.linspace(0, 1, 20)  # (20,)
y = x ** 2

plt.plot(x, y, 'ro')


# =================== 激活函数 =========================
# sigmoid函数
def sigmoid(x):
    return 1 / (1 + np.exp(-x))


# =================== 预测线 =========================
# 预测的w,b
w = 0.1
b = 0.1
# 预测的 predict_y

predict_y = sigmoid(w * x + b)  # 直线不可以拟合曲线的情况
line, = plt.plot(x, predict_y, 'b--')
# 用循环改变w的值
for i in range(10000):
    predict_y = sigmoid(w * x + b)
    # 更新w的值: 加入激活函数之后求导变得异常困难，该怎么办？
    w -= np.mean(2 * x * (predict_y - y)) * 0.05
    # 更新b的值
    b -= np.mean(2 * (predict_y - y)) * 0.05
    line.set_data(x, predict_y)
    plt.pause(0.1)
    # 输出总的距离大小
    distance = np.sum((predict_y - y) ** 2)
    print(distance)
